home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok72.lha / ConfigDemo / ConfigDemo.mod < prev    next >
Encoding:
Text File  |  1993-08-16  |  8.8 KB  |  300 lines

  1. (*************************************************************************
  2.  
  3. :Program.    ConfigDemo.mod
  4. :Contents.   small demo for reading and writing iff-configuration files
  5. :Author.     Hartmut Goebel [hG]
  6. :Copyright.  Public Domain
  7. :Language.   Oberon
  8. :Translator. Amiga Oberon V2.15
  9. :History.    V1.0, 15 Apr 1992 [hG]
  10. :Support.    Olfan `Olsen' Barthel: fragment from `term' source
  11. :Date.       19 Apr 1992 10:34:59
  12.  
  13. *************************************************************************)
  14.  
  15. MODULE ConfigDemo;
  16.  
  17. IMPORT
  18.   d  := Dos,
  19.   e  := Exec,
  20.   iff:= IFFParse,
  21.   ol := OberonLib,
  22.   req:= Requests,
  23.   s  := SYSTEM,
  24.   str:=  Strings;
  25.  
  26. CONST
  27.   NumConfigChunks = 4;
  28.   Version = 200; Revision = 42;
  29.  
  30. TYPE
  31.   ChunkStops = ARRAY 2 * NumConfigChunks OF LONGINT;
  32.  
  33. CONST
  34.   TEST = s.VAL(LONGINT,"TEST"); (* global FORM-Type *)
  35.   VERS = s.VAL(LONGINT,"VERS"); (* VersionInfo Follows *)
  36.   CNFG = s.VAL(LONGINT,"CNFG"); (* NewConfig follows *)
  37.   PORT = s.VAL(LONGINT,"PORT"); (* name of ARexx-Port *)
  38.   SCRN = s.VAL(LONGINT,"SCRN"); (* screen name *)
  39.   STRT = s.VAL(LONGINT,"STRT"); (* name of source file *)
  40.  
  41.   StopAt = ChunkStops(  (* That ar all the chunks we wanna read *)
  42.     TEST, CNFG,
  43.     TEST, PORT,
  44.     TEST, SCRN,
  45.     TEST, STRT);
  46.  
  47. TYPE
  48.   Configuration * = STRUCT
  49.     left*, top*, width*, height*: INTEGER;
  50.     screenDepth*: INTEGER;
  51.     aslLeft*, aslTop*, aslWidth*, aslHeight*: INTEGER;
  52.   END;
  53.  
  54.   VersionInfoPtr = POINTER TO VersionInfo;
  55.   VersionInfo = STRUCT
  56.     ver, rev: INTEGER;
  57.   END;
  58.  
  59. CONST
  60.   ThisVersion = VersionInfo(Version,Revision);
  61.  
  62.   StdConfig * = Configuration(
  63.     0,0,640,200,   (* window edges *)
  64.     0,             (* screendepth *)
  65.     20,20,100,200); (* asl edges *)
  66.  
  67. VAR
  68.   PortName *: e.STRPTR;
  69.   ScreenName * : e.STRPTR;
  70.   StartUpName *: e.STRPTR;  (* for ARexx-Scripts *)
  71.   Config *: Configuration;
  72.  
  73.  
  74. PROCEDURE WriteConfig * (Name: ARRAY OF CHAR): BOOLEAN; (* $CopyArrays- *)
  75. VAR
  76.   handle: iff.IFFHandlePtr;
  77.   success: BOOLEAN;
  78.   len: LONGINT;
  79. BEGIN
  80.   success := FALSE;
  81.  
  82.   handle := iff.AllocIFF();
  83.   IF handle # NIL THEN
  84.  
  85.     handle.stream := s.VAL(s.ADDRESS,d.Open(Name,d.newFile));
  86.     IF handle.stream # NIL THEN
  87.  
  88.       iff.InitIFFasDOS(handle);
  89.       IF iff.OpenIFF(handle,iff.write) = 0 THEN
  90.  
  91.         (* Push outmost chunk onto stack *)
  92.         IF iff.PushChunk(handle,TEST,iff.idFORM,iff.IFFSizeUnknown) = 0 THEN
  93.  
  94.           (* Add a version identifier *)
  95.           IF iff.PushChunk(handle,0,VERS,iff.IFFSizeUnknown) = 0 THEN
  96.             IF (iff.WriteChunkBytes(handle,ThisVersion,SIZE(ThisVersion)) = SIZE(ThisVersion))
  97.             & (iff.PopChunk(handle) = 0) THEN
  98.              success := TRUE;
  99.             END;
  100.           END;
  101.  
  102.           (* Push the config chunk on the stack *)
  103.           IF success & (iff.PushChunk(handle,0,CNFG,iff.IFFSizeUnknown) = 0) THEN
  104.             IF (iff.WriteChunkBytes(handle,Config,SIZE(Config)) = SIZE(Config))
  105.             & (iff.PopChunk(handle) = 0) THEN
  106.               success := TRUE;
  107.             END;
  108.           END;
  109.  
  110.           (* Now all the other chunks we wonna write *)
  111.           IF success & (PortName # NIL) THEN
  112.             IF (iff.PushChunk(handle,0,PORT,iff.IFFSizeUnknown) = 0) THEN
  113.               len := str.Length(PortName^);
  114.               IF (iff.WriteChunkBytes(handle,PortName^,len) # len)
  115.               OR (iff.PopChunk(handle) # 0) THEN
  116.                 success := FALSE;
  117.               END;
  118.             END;
  119.           END;
  120.  
  121.           IF success & (ScreenName # NIL) THEN
  122.             IF (iff.PushChunk(handle,0,SCRN,iff.IFFSizeUnknown) = 0) THEN
  123.               len := str.Length(ScreenName^);
  124.               IF (iff.WriteChunkBytes(handle,ScreenName^,len) # len)
  125.               OR (iff.PopChunk(handle) # 0) THEN
  126.                 success := FALSE;
  127.               END;
  128.             END;
  129.           END;
  130.  
  131.           IF success & (StartUpName # NIL) THEN
  132.             IF (iff.PushChunk(handle,0,STRT,iff.IFFSizeUnknown) = 0) THEN
  133.               len := str.Length(StartUpName^);
  134.               IF (iff.WriteChunkBytes(handle,StartUpName^,len) # len)
  135.               OR (iff.PopChunk(handle) # 0) THEN
  136.                 success := FALSE;
  137.               END;
  138.             END;
  139.           END;
  140.  
  141.           (* Seems that we're done, now try to pop the FORM chunk
  142.            * and return.
  143.            *)
  144.           IF iff.PopChunk(handle) # 0 THEN
  145.             success := FALSE;
  146.           END;
  147.         END;
  148.  
  149.         iff.CloseIFF(handle); (* Close the handle (flush any pending data). *)
  150.       END;
  151.  
  152.       (* Close the DOS handle itself. *)
  153.       IF ~d.Close(s.VAL(d.FileHandlePtr,handle.stream)) THEN
  154.         success := FALSE;
  155.       END;
  156.     END;
  157.  
  158.     iff.FreeIFF(handle); (* And free the IFF handle. *)
  159.   END;
  160.  
  161.   IF success & d.SetProtection(Name,LONGSET{d.execute}) THEN END;
  162.   RETURN success;
  163. END WriteConfig;
  164.  
  165.  
  166. PROCEDURE ReadConfig * (Name: ARRAY OF CHAR): BOOLEAN; (* $CopyArrays- *)
  167. VAR
  168.   handle: iff.IFFHandlePtr;
  169.   success: BOOLEAN;
  170.   size, err: LONGINT;
  171.   prop: iff.StoredPropertyPtr;
  172.   chunk: iff.ContextNodePtr;
  173.   verInfo: VersionInfoPtr;
  174.  
  175.   PROCEDURE ReadIFFString (VAR to: e.STRPTR);
  176.   VAR
  177.     string: e.STRING;
  178.   BEGIN
  179.     success := FALSE;
  180.  
  181.     (* Read only as much char as in the chunk *)
  182.     IF chunk.size < SIZE(e.STRING) THEN
  183.       size := chunk.size;
  184.     ELSE
  185.       size := SIZE(e.STRING);
  186.     END;
  187.  
  188.      (* The file read pointer is positioned just in front of the first data
  189.       * to be read, so let's don't disappoint iffparse and read it.
  190.       *)
  191.     IF iff.ReadChunkBytes(handle,string,size) = size THEN
  192.       ol.New(to,size+1);
  193.       IF to # NIL THEN
  194.         e.CopyMem(string,to^,size);
  195.         success := TRUE;
  196.       END;
  197.     END;
  198.   END ReadIFFString;
  199.  
  200. BEGIN
  201.   success := FALSE;
  202.  
  203.   handle := iff.AllocIFF();
  204.   IF handle # NIL THEN
  205.  
  206.     handle.stream := s.VAL(s.ADDRESS,d.Open(Name,d.oldFile));
  207.     IF handle.stream # NIL THEN
  208.       iff.InitIFFasDOS(handle);
  209.  
  210.       IF iff.OpenIFF(handle,iff.read) = 0 THEN
  211.  
  212.         (* Collect version number ID if available *)
  213.         IF iff.PropChunk(handle,TEST,VERS) = 0  THEN
  214.  
  215.           (* The following line tells iffparse to stop at the
  216.            * very beginning of one of the config chunks contained in a
  217.            * `TEST ' FORM chunk.
  218.            *)
  219.           IF iff.StopChunks(handle,StopAt,NumConfigChunks) = 0 THEN
  220.  
  221.             (* Parse the file... *)
  222.             LOOP
  223.               err := iff.ParseIFF(handle,iff.iffParseScan);
  224.               CASE err OF
  225.               |iff.IFFErrEOF: EXIT; (* finished *)
  226.               |iff.IFFErrEOC: (* No action *)
  227.               |0:
  228.                 chunk := iff.CurrentChunk(handle);
  229.                 IF (chunk # NIL) & (chunk.type = TEST) THEN
  230.                   CASE chunk.id OF
  231.                   |CNFG:
  232.                     prop := iff.FindProp(handle,TEST,VERS); (* Did we get a version ID? *)
  233.                     IF prop # NIL THEN
  234.                       (* Is it the file format we are able to read? *)
  235.                       verInfo := s.VAL(s.ADDRESS,prop.data);
  236.                       IF (verInfo.ver <= Version) & (verInfo.rev <= Revision) THEN
  237.                         IF chunk.size < SIZE(Config) THEN
  238.                           size := chunk.size;
  239.                         ELSE
  240.                           size := SIZE(Config);
  241.                         END;
  242.                         (* The file read pointer is positioned
  243.                          * just in front of the first data
  244.                          * to be read, so let's don't disappoint
  245.                          * iffparse and read it.
  246.                          *)
  247.                         IF iff.ReadChunkBytes(handle,Config,size) = size THEN
  248.                           success := TRUE; END;
  249.                       END;
  250.                     END;
  251.                   |PORT: ReadIFFString(PortName);
  252.                   |SCRN: ReadIFFString(ScreenName);
  253.                   |STRT: ReadIFFString(StartUpName);
  254.                   ELSE (* just ignore other Chunks *)
  255.                   END; (* CASE chunk.id *)
  256.                 END; (* IF chunk # NIL *)
  257.               ELSE
  258.                 success := FALSE; EXIT; (* error uccured *)
  259.               END; (* CASE err *)
  260.               IF ~success THEN EXIT; END
  261.             END; (* LOOP *)
  262.  
  263.           END; (* IF StopChunks *)
  264.         END; (* IF PropChunk *)
  265.  
  266.         iff.CloseIFF(handle);
  267.       END; (* IF OpenIFF *)
  268.  
  269.       IF ~d.Close(s.VAL(d.FileHandlePtr,handle.stream)) THEN
  270.         success := FALSE; END;
  271.  
  272.     END; (* IF d.OPpen *)
  273.  
  274.     iff.FreeIFF(handle);
  275.   END;  (* IF AllocHandle *)
  276.  
  277.   RETURN success;
  278. END ReadConfig;
  279.  
  280. BEGIN
  281.   req.Assert(d.dos.lib.version>=36,"ConfigDemo needs AmigaOS 2.0 or higher!");
  282.  
  283.   PortName := s.ADR("ARexxPort");
  284.   ScreenName := s.ADR("MyScreen");
  285.   StartUpName := s.ADR("StartMeUp!!");
  286.  
  287.   IF WriteConfig("t:test.iff") THEN END;
  288.  
  289.   PortName := NIL; ScreenName := NIL; StartUpName := NIL;
  290.  
  291.   IF ReadConfig("t:test.iff") THEN
  292.     d.PrintF("%s\n",PortName);
  293.     d.PrintF("%s\n",ScreenName);
  294.     d.PrintF("%s\n",StartUpName);
  295.   ELSE
  296.     IF d.PutStr("--> ReadError\n") = 0 THEN END;
  297.   END;
  298. END ConfigDemo.
  299.  
  300.